/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package slent.iespana.es.visualizacion;

import java.awt.event.*;
import javax.media.opengl.*;
import javax.media.opengl.glu.*;
import com.sun.opengl.util.GLUT;
import es.iespana.slent.reaccion.*;
import es.iespana.slent.tablaperiodica.*;
import java.util.*;
import java.util.ArrayList;
import slent.iespana.es.Quimica.TablaPeriodica.VentanaTablaPeriodica.TablaPeriodicaDefault;
import slent.iespana.es.Quimica.TablaPeriodica.VentanaTablaPeriodica.VentanaTablaPeriodica;

/**
 *
 * @author slent
 */
public class DibujadorReacciones implements GLEventListener, ActionListener, MouseMotionListener, MouseWheelListener {

    private GLU glu;
    GLUT glut = new GLUT();
    float x, y, xx, yy;
    float xtheta, prevx, prevy, ii;
    float ytheta;
    float rX, rY, rZ, k, k1, k2, w = 0.7f;
    private float perspectiva;
    private ReaccionNH3 dibujadorReaccion;
    private Reaccion reaccion;

    /**
     * Construye el visualizador de reacciones con la reaccion que se va a visualizar
     * @param reaccionAvisualizar
     */
    public DibujadorReacciones(Reaccion reaccionAvisualizar) {
        this.reaccion = reaccionAvisualizar;

        dibujadorReaccion = new ReaccionNH3();
        dibujadorReaccion.setReaccion(reaccion);
        dibujadorReaccion.preparar();
        dibujadorReaccion.setGlut(glut);
    }



    public void display(GLAutoDrawable gLDrawable) {
        GL gl = gLDrawable.getGL();



        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
        gl.glMatrixMode(GL.GL_PROJECTION);

        gl.glEnable(GL.GL_DEPTH_TEST);

        gl.glLoadIdentity();

        float[] ambientLight = {.10f, 0.2f, 0.2f, 1.0f};
        float[] diffuseLight = {1.0f, 1.0f, 1.0f, 1.0f};
        float[] specular = {1.0f, 1.0f, 1.0f, 1.0f};

        gl.glEnable(GL.GL_LIGHTING);
        gl.glEnable(GL.GL_COLOR_MATERIAL);

        gl.glLightModelfv(GL.GL_LIGHT_MODEL_AMBIENT, ambientLight, 0);
        float[] lightPos = {1.0f, .50f, 1.0f, 0.0f};

        gl.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, ambientLight, 0);
        gl.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, diffuseLight, 0);
        gl.glLightfv(GL.GL_LIGHT0, GL.GL_SPECULAR, specular, 0);
        gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, lightPos, 0);
        gl.glEnable(GL.GL_LIGHT0);


        float color[] = {.04f, 0.28f, 0.36f, 1.0f};
        float color1[] = {.1f, 0.10f, 0.10f, 1.0f};
        float[] specref = {.0f, .0f, .0f, 1.0f};
        gl.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT, color, 0);

        gl.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT, color, 0);
        gl.glMaterialfv(GL.GL_FRONT, GL.GL_DIFFUSE, color1, 0);
        gl.glMaterialfv(GL.GL_FRONT, GL.GL_SPECULAR, specref, 0);
        gl.glMateriali(GL.GL_FRONT, GL.GL_SHININESS, 128);

        setCamara(gl, glu, perspectiva);

        //previniendo  rotacion
        gl.glRotated(rX, 1, 0, 0);
        gl.glRotated(rY, 0, 1, 0);
        gl.glRotated(rZ, 0, 0, 1);

        dibujadorReaccion.dibujar(gl);

    }

    public void displayChanged(GLAutoDrawable glad, boolean bln, boolean bln1) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void init(GLAutoDrawable glad) {
        glu = new GLU();
        GL gl = glad.getGL();
        gl.glEnable(GL.GL_DEPTH_TEST);
        gl.glDepthFunc(GL.GL_LEQUAL);
        gl.glShadeModel(GL.GL_SMOOTH);
        gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
        gl.glClearColor(0.5f, 0.5f, 0.5f, 1f);

        glad.addMouseWheelListener(this);
        glad.addMouseMotionListener(this);
    }

    public void reshape(GLAutoDrawable glad, int i, int i1, int i2, int i3) {
        GL gl = glad.getGL();
        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
    }

    public void actionPerformed(ActionEvent e) {
    }

    private void setCamara(GL gl, GLU glu, float distancia) {
        //cambiamos la matriz de proyeccion
        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();

        //perspectiva
        float widthHeightRadio = 800f / 600f;
        glu.gluPerspective(45, widthHeightRadio, 1, 100);
        glu.gluLookAt(0, 0, distancia, 0, 0, 0, 0, 1, 0);

        gl.glMatrixMode(GL.GL_MODELVIEW);
        gl.glLoadIdentity();

    }

    public void mouseDragged(MouseEvent e) {
        System.out.println("mouseDragged");
        xx = e.getX();
        yy = e.getY();
        xtheta = (prevy - yy) * (360.0f / 800);
        ytheta = (xx - prevx) * (360.0f / 700);
        prevx = xx;
        prevy = yy;
        rX = rX + xtheta;
        rY = rY + ytheta;

        System.out.println("xtheta=" + xtheta);
        System.out.println("ytheta=" + ytheta);
    }

    public void mouseMoved(MouseEvent e) {
//        System.out.println("mousemoved");
    }

    public void mouseWheelMoved(MouseWheelEvent e) {
        System.out.println("mouseWheelmoved");
        perspectiva += e.getWheelRotation();
    }
    
}
